This is some in-development work, based on something you’ve previously seen.

Below you’ll see the following:

You can zoom in on the map (underlied by imagery), and clicking on community districts will highlight them both in the map and the scatterplot, and keep them in the table while excluding other rows. (The community district # will also be displayed). To reset the selection, you can either re-click the individual polygons, or just double click in the scatterplot. You can also draw a box around points in the scatterplot, which will highlight them in the map, and keep them in the table. (Unfortunately at this point, the table is really just for viewing - you can order data by clicking on column names, but you can’t select data in the table and have it reflected in the scatterplot/map.)

This is really for exploratory visualizations, and there are naturally additional things that can be added for ease of use. Compared to a previous version, this lets you select polygons, and also view the data in the table. In the near future I’ll work to do this with other layers, for example looking at combined % area canopy+grass by community district, and some other socio-economic variables from the Community Profiles. I’ll also work to add functionality to toggle layers on/off, and change the variable names as displayed. [running tally of desired functionality is at the bottom of the page.]



Desired Functionality: * Add back toggling of basemaps; * Add other layers to map (e.g., total area of estimated permeable or tree canopy; other socio-ecomic/health variables); * Change variable names in display (e.g., % of Households that are Rent Burdened); * Add another variable or two and make it so you can toggle between them; * Make it so you can select in the table and have that reflected in the map and scatterplot; * Histograms that highlight

LS0tCnRpdGxlOiAiUGN0IENhbm9weSB2cy4gUGN0IG9mIEhvdXNlaG9sZHMgUmVudCBCdXJkZW5lZCIKb3V0cHV0OiBodG1sX25vdGVib29rCmRhdGU6IDExIEZlYiAyMDE4CmF1dGhvcjogTWlrZSBUcmVnbGlhCi0tLQoKVGhpcyBpcyBzb21lIGluLWRldmVsb3BtZW50IHdvcmssIGJhc2VkIG9uIHNvbWV0aGluZyB5b3UndmUgcHJldmlvdXNseSBzZWVuLgoKQmVsb3cgeW91J2xsIHNlZSB0aGUgZm9sbG93aW5nOgoKKiBBIG1hcCBzaGFkZWQgYnkgJSBDYW5vcHkgQ292ZXIgYnkgTllDIENvbW11bml0eSBEaXN0cmljdCBbIkNhbl9QIiwgQmFzZWQgb24gMjAxMCBkYXRhOyBEYXJrZXIgR3JlZW4gPSBNb3JlIENhbm9weV0uIFRoZSBiYXNlbWFwIGlzIDIwMTYgTllDIEltYWdlcnk7CiogQSBzY2F0dGVycGxvdCBzaG93aW5nIHRoZSAlIG9mIGhvdXNlaG9sZHMgdGhhdCBhcmUgcmVudCBidXJkZW5lZCBvbiAgdGhlIHktYXhpcyBbW0Jhc2VkIG9uIFtOWUMgQ29tbXVuaXR5IFByb2ZpbGVzXShodHRwczovL2NvbW11bml0eXByb2ZpbGVzLnBsYW5uaW5nLm55Yy5nb3YvKV0sIHdpdGggJSBDYW5vcHkgQ292ZXIgb24gdGhlIHgtYXhpczsgYW5kIAoqIEEgdGFibGUgb2YgdGhlIGRhdGEuCgpZb3UgY2FuIHpvb20gaW4gb24gdGhlIG1hcCAodW5kZXJsaWVkIGJ5IGltYWdlcnkpLCBhbmQgY2xpY2tpbmcgb24gY29tbXVuaXR5IGRpc3RyaWN0cyB3aWxsIGhpZ2hsaWdodCB0aGVtIGJvdGggaW4gdGhlIG1hcCBhbmQgdGhlIHNjYXR0ZXJwbG90LCBhbmQga2VlcCB0aGVtIGluIHRoZSB0YWJsZSB3aGlsZSBleGNsdWRpbmcgb3RoZXIgcm93cy4gKFRoZSBjb21tdW5pdHkgZGlzdHJpY3QgIyB3aWxsIGFsc28gYmUgZGlzcGxheWVkKS4gVG8gcmVzZXQgdGhlIHNlbGVjdGlvbiwgeW91IGNhbiBlaXRoZXIgcmUtY2xpY2sgdGhlIGluZGl2aWR1YWwgcG9seWdvbnMsIG9yIGp1c3QgZG91YmxlIGNsaWNrIGluIHRoZSBzY2F0dGVycGxvdC4gIFlvdSBjYW4gYWxzbyBkcmF3IGEgYm94IGFyb3VuZCBwb2ludHMgaW4gdGhlIHNjYXR0ZXJwbG90LCB3aGljaCB3aWxsIGhpZ2hsaWdodCB0aGVtIGluIHRoZSBtYXAsIGFuZCBrZWVwIHRoZW0gaW4gdGhlIHRhYmxlLiAoVW5mb3J0dW5hdGVseSBhdCB0aGlzIHBvaW50LCB0aGUgdGFibGUgaXMgcmVhbGx5IGp1c3QgZm9yIHZpZXdpbmcgLSB5b3UgY2FuIG9yZGVyIGRhdGEgYnkgY2xpY2tpbmcgb24gY29sdW1uIG5hbWVzLCBidXQgeW91IGNhbid0IHNlbGVjdCBkYXRhIGluIHRoZSB0YWJsZSBhbmQgaGF2ZSBpdCByZWZsZWN0ZWQgaW4gdGhlIHNjYXR0ZXJwbG90L21hcC4pCgpUaGlzIGlzIHJlYWxseSBmb3IgZXhwbG9yYXRvcnkgdmlzdWFsaXphdGlvbnMsIGFuZCB0aGVyZSBhcmUgbmF0dXJhbGx5IGFkZGl0aW9uYWwgdGhpbmdzIHRoYXQgY2FuIGJlIGFkZGVkIGZvciBlYXNlIG9mIHVzZS4gQ29tcGFyZWQgdG8gYSBwcmV2aW91cyB2ZXJzaW9uLCB0aGlzIGxldHMgeW91IHNlbGVjdCBwb2x5Z29ucywgYW5kIGFsc28gdmlldyB0aGUgZGF0YSBpbiB0aGUgdGFibGUuIEluIHRoZSBuZWFyIGZ1dHVyZSBJJ2xsIHdvcmsgdG8gZG8gdGhpcyB3aXRoIG90aGVyIGxheWVycywgZm9yIGV4YW1wbGUgbG9va2luZyBhdCBjb21iaW5lZCAlIGFyZWEgY2Fub3B5K2dyYXNzIGJ5IGNvbW11bml0eSBkaXN0cmljdCwgYW5kIHNvbWUgb3RoZXIgc29jaW8tZWNvbm9taWMgdmFyaWFibGVzIGZyb20gdGhlIENvbW11bml0eSBQcm9maWxlcy4gSSdsbCBhbHNvIHdvcmsgdG8gYWRkIGZ1bmN0aW9uYWxpdHkgdG8gdG9nZ2xlIGxheWVycyBvbi9vZmYsIGFuZCBjaGFuZ2UgdGhlIHZhcmlhYmxlIG5hbWVzIGFzIGRpc3BsYXllZC4gW3J1bm5pbmcgdGFsbHkgb2YgZGVzaXJlZCBmdW5jdGlvbmFsaXR5IGlzIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UuXQoKCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPUZBTFNFfQojIyBBdCB0aW1lIG9mIHdyaXRpbmcgdGhpcyByZWxpZXMgb24gZGV2IHZlcnNpb24gb2Ygc2YgdG8gYWxsb3cgZm9yIGltcG9ydCBvZiBub24tc3BhdGlhbCB0YWJsZXMgZnJvbSBmZ2RiCiMjIHJlbGllcyBvbiBydG9vbHMgMy40IGJlaW5nIGluc3RhbGxlZDsgdGFrZXMgYSBmZXcgbWludXRlcyBvbiB3aW5kb3dzLCBhbmQgd2luZG93cyBtaWdodCBoYXZlIGlzc3VlcyB3LyBjb25mbGljdGluIFJjcHAgdmVyc2lvbnMKI2RldnRvb2xzOjppbnN0YWxsX2dpdGh1Yigici1zcGF0aWFsL3NmIikKCiMgVGhlIGlucHV0IGZpbGUgZ2VvZGF0YWJhc2UKZmdkYiA8LSAiLi4vTllDXzIwVXJiYW5fMjBUcmVlXzIwQ2Fub3B5XzIwQXNzZXNzbWVudF8yME1ldHJpY3NfMjAyMDEwLmdkYiIKZ2V0d2QoKQojIyBJZiBuZWVkZWQsIGNhbiBsaXN0IGFsbCBmZWF0dXJlIGNsYXNzZXMgaW4gYSBmaWxlIGdlb2RhdGFiYXNlCiNzdWJzZXQocmdkYWw6Om9nckRyaXZlcnMoKSwgZ3JlcGwoIkdEQiIsIG5hbWUpKQojZmNfbGlzdCA8LSByZ2RhbDo6b2dyTGlzdExheWVycyhmZ2RiKQojcHJpbnQoZmNfbGlzdCkKCiMjIFJlYWQgdGhlIHNwYXRpYWwgZGF0YQpjZGJuZCA8LSBzZjo6c3RfcmVhZChkc249ZmdkYixsYXllcj0iTllDX0NvbW11bml0eV9EaXN0cmljdHNfVmVyc2lvbjEwQyIpCgojcmVhZCB0aGUgdHJlZSBsYW5kIGNvdmVyIG1ldHJpY3MKY2RkYXRhIDwtIHNmOjpzdF9yZWFkKGRzbj1mZ2RiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyPSJMYW5kQ292ZXJfTWV0cmljc19OWUNfQ29tbXVuaXR5X0Rpc3RyaWN0c19WZXJzaW9uMTBDIikKCiMjIEFkZCB0aGUgdGFidWxhciBkYXRhIHRvIHRoZSBzcGF0aWFsIG9iamVjdApjZC5sYyA8LSBtZXJnZShjZGJuZCwgY2RkYXRhKQoKCiMjIExvYWQgdXAgdGhlIGNvbW11bml0eSBkaXN0cmljdCBwcm9maWxlIGRhdGEKI2NkcHJvZmlsZXMgPC0gcmVhZC5jc3YoImh0dHBzOi8vcGxhbm5pbmdsYWJzLmNhcnRvLmNvbS9hcGkvdjIvc3FsP2Zvcm1hdD1jc3YmcT1TRUxFQ1QlMjBjYXJ0b2RiX2lkLHRoZV9nZW9tLHRoZV9nZW9tX3dlYm1lcmNhdG9yLHNoYXJlZF9wdW1hLGZ1dHVyZV9mcF9taGhpLGN1cnJlbnRfZnBfbWhoaSxjZF90b3RfcmVzdW5pdHMsZnV0dXJlX2ZwX3Jlc3VuaXRzLGZ1dHVyZV9mcF9ibGRnLGN1cnJlbnRfZnBfcmVzdW5pdHMsY2RfdG90X2JsZGdzLGN1cnJlbnRfZnBfYmxkZyxtb2VfdW5kZXIxOF9yYXRlX255Yyxtb2VfdW5kZXIxOF9yYXRlX2Jvcm8sdG90YWxfbG90X2FyZWEsbG90X2FyZWFfb3RoZXJfbm9fZGF0YSxsb3RfYXJlYV9wYXJraW5nLGxvdF9hcmVhX29wZW5fc3BhY2UsbG90X2FyZWFfcHVibGljX2ZhY2lsaXR5X2luc3RpdHV0aW9uLGxvdF9hcmVhX3RyYW5zcG9ydGF0aW9uX3V0aWxpdHksbG90X2FyZWFfaW5kdXN0cmlhbF9tYW51ZmFjdHVyaW5nLGxvdF9hcmVhX2NvbW1lcmNpYWxfb2ZmaWNlLGxvdF9hcmVhX21peGVkX3VzZSxsb3RfYXJlYV9yZXNfbXVsdGlmYW1pbHlfZWxldmF0b3IsbG90X2FyZWFfcmVzX211bHRpZmFtaWx5X3dhbGt1cCxsb3RfYXJlYV9yZXNfMV8yX2ZhbWlseV9ibGRnLGxvdHNfdG90YWwsbG90c19vdGhlcl9ub19kYXRhLGxvdHNfdmFjYW50LGxvdHNfcGFya2luZyxsb3RzX29wZW5fc3BhY2UsbG90c19wdWJsaWNfZmFjaWxpdHlfaW5zdGl0dXRpb24sbG90c190cmFuc3BvcnRhdGlvbl91dGlsaXR5LGxvdHNfaW5kdXN0cmlhbF9tYW51ZmFjdHVyaW5nLGxvdHNfY29tbWVyY2lhbF9vZmZpY2UsbG90c19taXhlZF91c2UsbG90c19yZXNfbXVsdGlmYW1pbHlfZWxldmF0b3IsbG90c19yZXNfbXVsdGlmYW1pbHlfd2Fsa3VwLGxvdHNfcmVzXzFfMl9mYW1pbHlfYmxkZyxwY3Rfc2VydmVkX3BhcmtzLGNvdW50X3B1YmxpY19zY2hvb2xzLGNvdW50X2xpYnJhcmllcyxjb3VudF9ob3NwX2NsaW5pYyxjb3VudF9wYXJrcyxjcmltZV9jb3VudF9ueWMsY3JpbWVfY291bnRfYm9ybyxjcmltZV9jb3VudCxwY3RfY2xlYW5fc3RydHNfbnljLHBvcF8xMV8xNV9hY3MscG9wXzIwMTAscG9wXzIwMDAscHVtYSxib3JvY2QsZnV0dXJlX2ZwX3BvcCxjdXJyZW50X2ZwX3BvcCxsb3RfYXJlYV92YWNhbnQsY2JfZW1haWwsY2Jfd2Vic2l0ZSxhY3NfdG9vbHRpcCxuZWlnaGJvcmhvb2RzLHNvbl9pc3N1ZV8zLHNvbl9pc3N1ZV8yLHNvbl9pc3N1ZV8xLGNkX3Nvbl9meTIwMTgsc2hhcmVkX3B1bWFfY2QsY2Rfc2hvcnRfdGl0bGUsY2RfZnVsbF90aXRsZSxmdXR1cmVfZnBfY29zdF9idXJkZW4sY3VycmVudF9mcF9jb3N0X2J1cmRlbixmdXR1cmVfZnBfcmVudF9idXJkZW4sY3VycmVudF9mcF9yZW50X2J1cmRlbixmdXR1cmVfZnBfcGVybW9ydGcsY3VycmVudF9mcF9wZXJtb3J0ZyxmdXR1cmVfZnBfb3duZXJvY2MsY3VycmVudF9mcF9vd25lcm9jYyxmdXR1cmVfZnBfb3BlbnNwYWNlLGN1cnJlbnRfZnBfb3BlbnNwYWNlLGZ1dHVyZV9mcF9hcmVhLGN1cnJlbnRfZnBfYXJlYSxwY3RfaGlzcGFuaWMscGN0X290aGVyX25oLHBjdF9hc2lhbl9uaCxwY3RfYmxhY2tfbmgscGN0X3doaXRlX25oLGZlbWFsZV84NV9vdmVyLG1hbGVfODVfb3ZlcixmZW1hbGVfODBfODQsbWFsZV84MF84NCxmZW1hbGVfNzVfNzksbWFsZV83NV83OSxmZW1hbGVfNzBfNzQsbWFsZV83MF83NCxmZW1hbGVfNjVfNjksbWFsZV82NV82OSxmZW1hbGVfNjBfNjQsbWFsZV82MF82NCxmZW1hbGVfNTVfNTksbWFsZV81NV81OSxmZW1hbGVfNTBfNTQsbWFsZV81MF81NCxmZW1hbGVfNDVfNDksbWFsZV80NV80OSxmZW1hbGVfNDBfNDQsbWFsZV80MF80NCxmZW1hbGVfMzVfMzksbWFsZV8zNV8zOSxmZW1hbGVfMzBfMzQsbWFsZV8zMF8zNCxmZW1hbGVfMjVfMjksbWFsZV8yNV8yOSxmZW1hbGVfMjBfMjQsbWFsZV8yMF8yNCxmZW1hbGVfMTVfMTksbWFsZV8xNV8xOSxmZW1hbGVfMTBfMTQsbWFsZV8xMF8xNCxmZW1hbGVfNV85LG1hbGVfNV85LGZlbWFsZV91bmRlcl81LG1hbGVfdW5kZXJfNSxtb2Vfb3ZlcjY1X3JhdGVfbnljLG92ZXI2NV9yYXRlX255Yyxtb2Vfb3ZlcjY1X3JhdGVfYm9ybyxvdmVyNjVfcmF0ZV9ib3JvLG1vZV9vdmVyNjVfcmF0ZSxvdmVyNjVfcmF0ZSx1bmRlcjE4X3JhdGVfbnljLHVuZGVyMThfcmF0ZV9ib3JvLG1vZV91bmRlcjE4X3JhdGUsdW5kZXIxOF9yYXRlLG1vZV9sZXBfcmF0ZV9ueWMsbGVwX3JhdGVfbnljLG1vZV9sZXBfcmF0ZV9ib3JvLGxlcF9yYXRlX2Jvcm8sbW9lX2xlcF9yYXRlLGxlcF9yYXRlLG1vZV9mb3JlaWduX2Jvcm4scGN0X2ZvcmVpZ25fYm9ybixwY3RfbG90X2FyZWFfb3RoZXJfbm9fZGF0YSxwY3RfbG90X2FyZWFfdmFjYW50LHBjdF9sb3RfYXJlYV9wYXJraW5nLHBjdF9sb3RfYXJlYV9vcGVuX3NwYWNlLHBjdF9sb3RfYXJlYV9wdWJsaWNfZmFjaWxpdHlfaW5zdGl0dXRpb24scGN0X2xvdF9hcmVhX3RyYW5zcG9ydGF0aW9uX3V0aWxpdHkscGN0X2xvdF9hcmVhX2luZHVzdHJpYWxfbWFudWZhY3R1cmluZyxwY3RfbG90X2FyZWFfY29tbWVyY2lhbF9vZmZpY2UscGN0X2xvdF9hcmVhX21peGVkX3VzZSxwY3RfbG90X2FyZWFfcmVzX211bHRpZmFtaWx5X2VsZXZhdG9yLHBjdF9sb3RfYXJlYV9yZXNfbXVsdGlmYW1pbHlfd2Fsa3VwLHBjdF9sb3RfYXJlYV9yZXNfMV8yX2ZhbWlseV9ibGRnLGNyaW1lX3Blcl8xMDAwX255YyxjcmltZV9wZXJfMTAwMF9ib3JvLGNyaW1lX3Blcl8xMDAwLHBjdF9jbGVhbl9zdHJ0c19ib3JvLHBjdF9jbGVhbl9zdHJ0cyxtb2VfaGhfcmVudF9idXJkX255YyxwY3RfaGhfcmVudF9idXJkX255Yyxtb2VfaGhfcmVudF9idXJkX2Jvcm8scGN0X2hoX3JlbnRfYnVyZF9ib3JvLG1vZV9oaF9yZW50X2J1cmQscGN0X2hoX3JlbnRfYnVyZCxtb2VfbWVhbl9jb21tdXRlX255YyxtZWFuX2NvbW11dGVfbnljLG1vZV9tZWFuX2NvbW11dGVfYm9ybyxtZWFuX2NvbW11dGVfYm9ybyxtb2VfbWVhbl9jb21tdXRlLG1lYW5fY29tbXV0ZSxtb2VfdW5lbW5wbG95bWVudCx1bmVtcGxveW1lbnRfbnljLG1vZV91bmVtcGxveW1lbnRfYm9ybyx1bmVtcGxveW1lbnRfYm9ybyxtb2VfdW5lbXBsb3ltZW50X2NkLHVuZW1wbG95bWVudF9jZCxtb2VfYmFjaF9kZWdfbnljLHBjdF9iYWNoX2RlZ19ueWMsbW9lX2JhY2hfZGVnX2Jvcm8scGN0X2JhY2hfZGVnX2Jvcm8sbW9lX2JhY2hfZGVnLHBjdF9iYWNoX2RlZyxwb3ZlcnR5X3JhdGVfbnljLHBvdmVydHlfcmF0ZV9ib3JvLG1vZV9wb3ZlcnR5X3JhdGUscG92ZXJ0eV9yYXRlLHBvcF9jaGFuZ2VfMDBfMTAsYXJlYV9zcW1pLGFjcmVzJTIwRlJPTSUyMGNvbW11bml0eV9kaXN0cmljdF9wcm9maWxlcyZmaWxlbmFtZT1RdWVlbnMtNy1pbmRpY2F0b3JzLmNzdiIpCgoKY2Rwcm9maWxlcyA8LSByZWFkLmNzdigiaHR0cHM6Ly9wbGFubmluZ2xhYnMuY2FydG8uY29tL2FwaS92Mi9zcWw/Zm9ybWF0PWNzdiZxPVNFTEVDVCUyMGNhcnRvZGJfaWQsYm9yb2NkLHBjdF9oaF9yZW50X2J1cmQlMjBGUk9NJTIwY29tbXVuaXR5X2Rpc3RyaWN0X3Byb2ZpbGVzIikKIyMgRm9yIHNvbWUgZWFzaWVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGRhdGEsIGRhdGEgZGljdGlvbmFyeToKY2Rwcm9maWxlLmRhdGFkaWMgPC0gcmVhZC5jc3YoImh0dHBzOi8vY29tbXVuaXR5cHJvZmlsZXMucGxhbm5pbmcubnljLmdvdi9kYXRhL2NkX3Byb2ZpbGVfZGF0YV9kaWN0aW9uYXJ5LmNzdiIpCgojIyBNZXJnZSB3aXRoIGxhbmQgY292ZXIgZGF0YQpjZC5sYy5jcCA8LSBtZXJnZShjZC5sYywgY2Rwcm9maWxlcywgYnkueD0iQm9yb0NEIiwgYnkueT0iYm9yb2NkIikKCmNkLmxjLmNwJENhbl9QIDwtIHJvdW5kKGNkLmxjLmNwJENhbl9QLCAwKQpjZC5sYy5jcCRwY3RfaGhfcmVudF9idXJkIDwtIHJvdW5kKGNkLmxjLmNwJHBjdF9oaF9yZW50X2J1cmQsIDApCgoKI2luc3RhbGwucGFja2FnZXMoYygicGxvdGx5IiwgIkRUIikpCmNkLmxjLmNwMiA8LSBjZC5sYy5jcFssYygiQm9yb0NEIiwgIkNhbl9QIiwgInBjdF9oaF9yZW50X2J1cmQiKV0Kb2JqZWN0LnNpemUoY2QubGMuY3AyKQoKbGlicmFyeShzZikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShjcm9zc3RhbGspCmxpYnJhcnkoaHRtbHRvb2xzKQoKY2QubGMuY3AyIDwtIHN0X3RyYW5zZm9ybShjZC5sYy5jcDIsIGNycz00MzI2KQogIApjZF9zZCA8LSBTaGFyZWREYXRhJG5ldygKICBjZC5sYy5jcDIsCiAga2V5PX5Cb3JvQ0QsCiAgIyBwcm92aWRlIGV4cGxpY2l0IGdyb3VwIHNvIHdlIGNhbiBlYXNpbHkgcmVmZXIgdG8gdGhpcyBsYXRlcgogIGdyb3VwID0gIkJvcm9DRCIKKQoKCgptYXAgPC0gbGVhZmxldChjZF9zZCkgJT4lCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5Qb3NpdHJvbikgJT4lCiAgYWRkVGlsZXModXJsVGVtcGxhdGUgPSAiaHR0cHM6Ly9tYXBzLm55Yy5nb3YvdG1zLzEuMC4wL3Bob3RvLzIwMTYve3p9L3t4fS97eX0ucG5nOCIsCiAgICAgICAgICAgYXR0cmlidXRpb24gPSAnSW1hZ2VyeSBmcm9tIHRoZSA8YSBocmVmPSJodHRwczovL21hcHMubnljLmdvdi90aWxlcy8iPkNpdHkgb2YgTmV3IFlvcms8L2E+JywKICAgICAgICAgICBvcHRpb25zID0gdGlsZU9wdGlvbnMobWluTmF0aXZlWm9vbT0gOCwgbWF4TmF0aXZlWm9vbT0gMTksIHN1YmRvbWFpbnM9ICcxMjM0JywgdG1zPVRSVUUpKSAlPiUgICAgI2FkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJENhcnRvREIuUG9zaXRyb24pICU+JQogIGFkZFBvbHlnb25zKAogICAgZGF0YT1jZC5sYy5jcDIsCiAgICBsYXllcklkID0gfkJvcm9DRCwKICAgIGNvbG9yID0gIiM0NDQ0NDQiLAogICAgd2VpZ2h0ID0gMSwKICAgIHNtb290aEZhY3RvciA9IDAuNSwKICAgIG9wYWNpdHkgPSAxLjAsCiAgICBmaWxsT3BhY2l0eSA9IDAuNSwKICAgIGZpbGxDb2xvciA9IH5jb2xvclF1YW50aWxlKCJHcmVlbnMiLCBDYW5fUCkoQ2FuX1ApLAogICAgcG9wdXA9fmFzLmNoYXJhY3RlcihwYXN0ZSgiQ29tbXVuaXR5IERpc3RyaWN0IiwgQm9yb0NEKSksIywKIyAgdHVybiBvZmYgaGlnaGxpZ2h0IHNpbmNlIGl0IGludGVyZmVyZXMgd2l0aCBzZWxlY3Rpb24gc3R5bGluZwojICAgaWYgY2FyZWZ1bCB3aXRoIHN0eWxpbmcgY291bGQgaGF2ZSBib3RoIGhpZ2hsaWdodCBhbmQgc2VsZWN0CiMgICAgaGlnaGxpZ2h0T3B0aW9ucyA9IGhpZ2hsaWdodE9wdGlvbnMoY29sb3IgPSAid2hpdGUiLCB3ZWlnaHQgPSAyKQogICkKCiMgYm9ycm93IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3Itc3BhdGlhbC9tYXBlZGl0L2Jsb2IvbWFzdGVyL1IvcXVlcnkuUiNMNzMtTDEzMgojICAgdG8gc2VsZWN0L2Rlc2VsZWN0IGZlYXR1cmVzIGJ1dCBpbnN0ZWFkIG9mIFNoaW55Lm9uSW5wdXRDaGFuZ2UKIyAgIHVzZSBjcm9zc3RhbGsgdG8gbWFuYWdlIHN0YXRlCmFkZF9zZWxlY3Rfc2NyaXB0IDwtIGZ1bmN0aW9uKGxmLCBzdHlsZUZhbHNlLCBzdHlsZVRydWUsIG5zPSIiKSB7CiAgIyMgY2hlY2sgZm9yIGV4aXN0aW5nIG9uUmVuZGVyIGpzSG9vaz8KCiAgaHRtbHdpZGdldHM6Om9uUmVuZGVyKAogICAgbGYsCiAgICBzcHJpbnRmKAoiCmZ1bmN0aW9uKGVsLHgpIHsKICB2YXIgbGYgPSB0aGlzOwogIHZhciBzdHlsZV9vYmogPSB7CiAgICAnZmFsc2UnOiAlcywKICAgICd0cnVlJzogJXMKICB9CgogIC8vIGluc3RlYWQgb2Ygc2hpbnkgaW5wdXQgYXMgb3VyIHN0YXRlIG1hbmFnZXIKICAvLyAgIHVzZSBjcm9zc3RhbGsKICBpZihjcm9zc3RhbGspIHsKICAgIHZhciBjdF9zZWwgPSBuZXcgY3Jvc3N0YWxrLlNlbGVjdGlvbkhhbmRsZSgpCiAgICBjdF9zZWwuc2V0R3JvdXAoJ0Jvcm9DRCcpCiAgICBjdF9zZWwub24oJ2NoYW5nZScsIGZ1bmN0aW9uKHgpewogICAgICBpZih4LnNlbmRlciAhPT0gY3Rfc2VsKSB7IC8vaWdub3JlIHNlbGVjdCBmcm9tIHRoaXMgbWFwCiAgICAgICAgbGYuZWFjaExheWVyKGZ1bmN0aW9uKGx5cil7CiAgICAgICAgICBpZihseXIub3B0aW9ucyAmJiBseXIub3B0aW9ucy5sYXllcklkKSB7CiAgICAgICAgICAgIHZhciBpZCA9IFN0cmluZyhseXIub3B0aW9ucy5sYXllcklkKQogICAgICAgICAgICBpZigKICAgICAgICAgICAgICAheC52YWx1ZSAgfHwKICAgICAgICAgICAgICAoQXJyYXkuaXNBcnJheSh4LnZhbHVlKSAmJiB4LnZhbHVlLmluZGV4T2YoaWQpID09PSAtMSkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgdG9nZ2xlX3N0YXRlKGx5ciwgZmFsc2UpCiAgICAgICAgICAgICAgdG9nZ2xlX3N0eWxlKGx5ciwgc3R5bGVfb2JqLmZhbHNlKQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkoeC52YWx1ZSkgJiYgeC52YWx1ZS5pbmRleE9mKGlkKSA+IC0xKSB7CiAgICAgICAgICAgICAgdG9nZ2xlX3N0YXRlKGx5ciwgdHJ1ZSkKICAgICAgICAgICAgICB0b2dnbGVfc3R5bGUobHlyLCBzdHlsZV9vYmoudHJ1ZSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KICAgIH0pCiAgfQoKICAvLyBkZWZpbmUgb3VyIGZ1bmN0aW9ucyBmb3IgdG9nZ2xpbmcKICBmdW5jdGlvbiB0b2dnbGVfc3R5bGUobGF5ZXIsIHN0eWxlX29iaikgewogICAgbGF5ZXIuc2V0U3R5bGUoc3R5bGVfb2JqKTsKICB9OwogIGZ1bmN0aW9uIHRvZ2dsZV9zdGF0ZShsYXllciwgc2VsZWN0ZWQsIGluaXQpIHsKICAgIGlmKHR5cGVvZihzZWxlY3RlZCkgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgIGxheWVyLl9tYXBlZGl0X3NlbGVjdGVkID0gc2VsZWN0ZWQ7CiAgICB9IGVsc2UgewogICAgICBzZWxlY3RlZCA9ICFsYXllci5fbWFwZWRpdF9zZWxlY3RlZDsKICAgICAgbGF5ZXIuX21hcGVkaXRfc2VsZWN0ZWQgPSBzZWxlY3RlZDsKICAgIH0KICAgIGlmKHR5cGVvZihTaGlueSkgIT09ICd1bmRlZmluZWQnICYmIFNoaW55Lm9uSW5wdXRDaGFuZ2UgJiYgIWluaXQpIHsKICAgICAgU2hpbnkub25JbnB1dENoYW5nZSgKICAgICAgICAnJXMtbWFwZWRpdF9zZWxlY3RlZCcsCiAgICAgICAgewogICAgICAgICAgJ2dyb3VwJzogbGF5ZXIub3B0aW9ucy5ncm91cCwKICAgICAgICAgICdpZCc6IGxheWVyLm9wdGlvbnMubGF5ZXJJZCwKICAgICAgICAgICdzZWxlY3RlZCc6IHNlbGVjdGVkCiAgICAgICAgfQogICAgICApCiAgICB9CgogICAgaWYoY3Rfc2VsKSB7CiAgICAgIHZhciBjdF92YWx1ZXMgPSBjdF9zZWwudmFsdWUKICAgICAgdmFyIGlkID0gU3RyaW5nKGxheWVyLm9wdGlvbnMubGF5ZXJJZCkKICAgICAgaWYoc2VsZWN0ZWQpIHsKICAgICAgICBpZighY3RfdmFsdWVzKSB7CiAgICAgICAgICBjdF9zZWwuc2V0KFtpZF0pCiAgICAgICAgfQogICAgICAgIGlmKEFycmF5LmlzQXJyYXkoY3RfdmFsdWVzKSAmJiBjdF92YWx1ZXMuaW5kZXhPZihpZCkgPT09IC0xKSB7CiAgICAgICAgICBjdF9zZWwuc2V0KGN0X3ZhbHVlcy5jb25jYXQoaWQpKQogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYoY3RfdmFsdWVzICYmICFzZWxlY3RlZCkgewogICAgICAgIGN0X3ZhbHVlcy5sZW5ndGggPiAxID8KICAgICAgICAgIGN0X3NlbC5zZXQoCiAgICAgICAgICAgIGN0X3ZhbHVlcy5maWx0ZXIoZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgIHJldHVybiBkICE9PSBpZAogICAgICAgICAgICB9KQogICAgICAgICAgKSA6CiAgICAgICAgICBjdF9zZWwuc2V0KG51bGwpIC8vIHNlbGVjdCBhbGwgaWYgbm90aGluZyBzZWxlY3RlZAogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHNlbGVjdGVkOwogIH07CiAgLy8gc2V0IHVwIGNsaWNrIGhhbmRsZXIgb24gZWFjaCBsYXllciB3aXRoIGEgZ3JvdXAgbmFtZQogIGxmLmVhY2hMYXllcihmdW5jdGlvbihseXIpewogICAgaWYobHlyLm9uICYmIGx5ci5vcHRpb25zICYmIGx5ci5vcHRpb25zLmxheWVySWQpIHsKICAgICAgLy8gc3RhcnQgd2l0aCBhbGwgdW5zZWxlY3RlZCA/CiAgICAgIHRvZ2dsZV9zdGF0ZShseXIsIGZhbHNlLCBpbml0PXRydWUpOwogICAgICB0b2dnbGVfc3R5bGUobHlyLCBzdHlsZV9vYmpbbHlyLl9tYXBlZGl0X3NlbGVjdGVkXSk7CiAgICAgIGx5ci5vbignY2xpY2snLGZ1bmN0aW9uKGUpewogICAgICAgIHZhciBzZWxlY3RlZCA9IHRvZ2dsZV9zdGF0ZShlLnRhcmdldCk7CiAgICAgICAgdG9nZ2xlX3N0eWxlKGUudGFyZ2V0LCBzdHlsZV9vYmpbU3RyaW5nKHNlbGVjdGVkKV0pOwogICAgICB9KTsKICAgIH0KICB9KTsKfQoiLAogICAgICBqc29ubGl0ZTo6dG9KU09OKHN0eWxlRmFsc2UsIGF1dG9fdW5ib3g9VFJVRSksCiAgICAgIGpzb25saXRlOjp0b0pTT04oc3R5bGVUcnVlLCBhdXRvX3VuYm94PVRSVUUpLAogICAgICBucwogICAgKQogICkKfQoKCmR0IDwtIGRhdGF0YWJsZShjZF9zZCwgd2lkdGg9IjEwMCUiKQpkdCR4JGRhdGEgPC0gZHBseXI6OnNlbGVjdChkdCR4JGRhdGEsIC1nZW9tZXRyeSkKI2R0JHgkZGF0YSA8LSBkcGx5cjo6c2VsZWN0KGR0JHgkZGF0YSwgQm9yb0NELCBDYW5fUCwgcGN0X2hoX3JlbnRfYnVyZCkKZHQkeCRvcHRpb25zJGNvbHVtbkRlZnNbWzFdXSR0YXJnZXRzIDwtIHNlcV9sZW4obmNvbChjZC5sYy5jcDIpLTEpCiNkdCR4JG9wdGlvbnMkY29sdW1uRGVmc1tbMV1dJHRhcmdldHMgPC0gKHdoaWNoKG5hbWVzKGR0JHgkZGF0YT09YygiQm9yb0NEIiwgIkNhbl9QIiwgInBjdF9oaF9yZW50X2J1cmQiKSkpKQojc2VxX2xlbihuY29sKGR0JHgkZGF0YSkpCgoKIyhkdCR4JG9wdGlvbnMkY29sdW1uRGVmc1tbMV1dJHRhcmdldHMpPT0iQm9yb0NEIgoKYXR0cihkdCR4LCAiY29sbmFtZXMiKSA8LSBhdHRyKGR0JHgsICJjb2xuYW1lcyIpI1t3aGljaChhdHRyKGR0JHgsICJjb2xuYW1lcyIpICE9ICJnZW9tZXRyeSIpXQpkdCR4JGNvbnRhaW5lciA8LSBnc3ViKHg9ZHQkeCRjb250YWluZXIsIHBhdHRlcm49Ijx0aD5nZW9tZXRyeTwvdGg+XG4iLCByZXBsYWNlbWVudD0iIikKI2R0CgojIG5vdyB0cnkgbGVhZmxldCwgcGxvdGx5LCBhbmQgZHQKIyAgIHRoaXMgdW5mb3J0dW5hdGVseSBkb2VzIG5vdCB3b3JrCiMgICBleGFjdGx5IGFzIHdlIHdvdWxkIGxpa2UgYnV0IHBsb3RseSB1c2Ugb2YgU3RyaW5nIGtleQojICAgc2VlbXMgdG8gY2F1c2UgdGhlIHByb2JsZW0KIyAgIGZpeGluZyBQbG90bHkgaXMgb3V0IG9mIHNjb3BlIG9mIHRoaXMgcHJvamVjdAojICAgYnV0IEkgbWlnaHQgdGFrZSBhIGxvb2sgYXQgc29tZSBwb2ludCB0byBzdWJtaXQgcHVsbApicm93c2FibGUoCiAgdGFnTGlzdCgKICAgIHRhZ3MkZGl2KAogICAgICBzdHlsZSA9ICJmbG9hdDpsZWZ0OyB3aWR0aDogNDklOyIsCiAgICAgIGFkZF9zZWxlY3Rfc2NyaXB0KAogICAgICAgIG1hcCwKICAgICAgICBzdHlsZUZhbHNlID0gbGlzdChmaWxsT3BhY2l0eSA9IDAuNiwgd2VpZ2h0ID0gMSwgb3BhY2l0eSA9IDAuNCwgY29sb3I9ImJsYWNrIiksCiAgICAgICAgc3R5bGVUcnVlID0gbGlzdChmaWxsT3BhY2l0eSA9IDAuNywgd2VpZ2h0ID0gMywgb3BhY2l0eSA9IDAuNywgY29sb3I9ImJsdWUiKSwKICAgICAgICBucyA9ICIiCiAgICAgICkKICAgICksCiAgICB0YWdzJGRpdigKICAgICAgc3R5bGUgPSAiZmxvYXQ6bGVmdDsgd2lkdGg6IDQ5JTsiLAogICAgICBwbG90X2x5KGNkX3NkLCB4ID0gfkNhbl9QLCB5ID0gfnBjdF9oaF9yZW50X2J1cmQpICU+JQogICAgICAgIGFkZF9tYXJrZXJzKGFscGhhID0gMC41LHRleHQgPSB+cGFzdGUoJ0NvbW11bml0eSBEaXN0cmljdDogJywgQm9yb0NEKSkgJT4lCiAgICAgICAgaGlnaGxpZ2h0KG9uID0gInBsb3RseV9zZWxlY3RlZCIpCiAgICApLAogICAgdGFncyRkaXYoCiAgICAgIHN0eWxlID0gImZsb2F0OmxlZnQ7IHdpZHRoOiA5OCU7IiwKICAgICAgZHQKICAgICkKICApCikKCmBgYAo8YnIgLz4gCjxiciAvPgoKCgpEZXNpcmVkIEZ1bmN0aW9uYWxpdHk6CiogQWRkIGJhY2sgdG9nZ2xpbmcgb2YgYmFzZW1hcHM7CiogQWRkIG90aGVyIGxheWVycyB0byBtYXAgKGUuZy4sIHRvdGFsIGFyZWEgb2YgZXN0aW1hdGVkIHBlcm1lYWJsZSBvciB0cmVlIGNhbm9weTsgb3RoZXIgc29jaW8tZWNvbWljL2hlYWx0aCB2YXJpYWJsZXMpOwoqIENoYW5nZSB2YXJpYWJsZSBuYW1lcyBpbiBkaXNwbGF5IChlLmcuLCAlIG9mIEhvdXNlaG9sZHMgdGhhdCBhcmUgUmVudCBCdXJkZW5lZCk7CiogQWRkIGFub3RoZXIgdmFyaWFibGUgb3IgdHdvIGFuZCBtYWtlIGl0IHNvIHlvdSBjYW4gdG9nZ2xlIGJldHdlZW4gdGhlbTsKKiBNYWtlIGl0IHNvIHlvdSBjYW4gc2VsZWN0IGluIHRoZSAgdGFibGUgYW5kIGhhdmUgdGhhdCByZWZsZWN0ZWQgaW4gdGhlIG1hcCBhbmQgc2NhdHRlcnBsb3Q7CiogSGlzdG9ncmFtcyB0aGF0IGhpZ2hsaWdodA==